"""类型转换器模块"""

from typing import Optional
from .types import MiaomaType, MySQLTypeInfo
from .exceptions import UnsupportedTypeError
from .type_info import MIAOMA_TYPE_INFO_MAP

# MySQL类型到妙码类型的转换器
class MySQLToMiaomaTypeConverter:
    @staticmethod
    def convert(mysql_type: str, length: Optional[int] = None,
               precision: Optional[int] = None, scale: Optional[int] = None) -> MiaomaType:
        """
        将MySQL类型转换为妙码类型

        支持的MySQL类型:
        - 数值类型: BIGINT, INT, MEDIUMINT, SMALLINT, TINYINT, DECIMAL, FLOAT, DOUBLE
        - 字符串类型: VARCHAR, CHAR, TEXT, TINYTEXT, MEDIUMTEXT, LONGTEXT
        - 二进制类型: BINARY, VARBINARY, BLOB, TINYBLOB, MEDIUMBLOB, LONGBLOB
        - 时间类型: DATE, DATETIME, TIMESTAMP
        - 其他类型: JSON

        不支持的MySQL类型:
        - SET: 集合类型
        - ENUM: 枚举类型
        - GEOMETRY: 几何类型
        - POINT: 点类型
        - LINESTRING: 线类型
        - POLYGON: 多边形类型

        :param mysql_type: MySQL类型名称
        :param length: 长度参数
        :param precision: 精度
        :param scale: 小数位数
        :return: 妙码类型
        :raises UnsupportedTypeError: 当遇到不支持的MySQL类型时抛出
        """
        mysql_type = mysql_type.upper()

        # 特殊处理TINYINT(1)为BOOLEAN
        if mysql_type == 'TINYINT' and length == 1:
            return MiaomaType.MIAOMA_BASE_BOOLEAN

        # 数值类型映射
        if mysql_type in ('BIGINT',):
            return MiaomaType.MIAOMA_BASE_BIGINT
        if mysql_type in ('INT', 'INTEGER', 'MEDIUMINT', 'SMALLINT', 'TINYINT'):
            return MiaomaType.MIAOMA_BASE_INTEGER
        if mysql_type == 'DECIMAL':
            return MiaomaType.MIAOMA_BASE_DECIMAL
        if mysql_type in ('FLOAT', 'DOUBLE'):
            return MiaomaType.MIAOMA_BASE_FLOAT

        # 字符串类型映射
        if mysql_type in ('VARCHAR', 'CHAR'):
            return MiaomaType.MIAOMA_BASE_STRING
        if mysql_type in ('TEXT', 'TINYTEXT', 'MEDIUMTEXT', 'LONGTEXT'):
            return MiaomaType.MIAOMA_BASE_TEXT

        # 二进制类型映射
        if mysql_type in ('BINARY', 'VARBINARY', 'BLOB', 'TINYBLOB', 'MEDIUMBLOB', 'LONGBLOB'):
            return MiaomaType.MIAOMA_BASE_BINARY

        # 时间类型映射
        if mysql_type == 'DATE':
            return MiaomaType.MIAOMA_BASE_DATE
        if mysql_type == 'DATETIME':
            return MiaomaType.MIAOMA_BASE_DATETIME
        if mysql_type == 'TIMESTAMP':
            return MiaomaType.MIAOMA_BASE_TIMESTAMP

        # 其他类型映射
        if mysql_type == 'JSON':
            return MiaomaType.MIAOMA_BASE_JSON

        # 对于不支持的类型抛出异常
        raise UnsupportedTypeError(mysql_type)

def get_java_type(type_info: MySQLTypeInfo) -> str:
    """
    从MySQL类型信息获取Java类型

    转换流程：
    1. MySQL类型信息 -> MiaomaType
    2. MiaomaType -> MiaomaTypeInfo
    3. MiaomaTypeInfo -> java_type

    :param type_info: MySQL类型信息
    :return: Java类型字符串
    :raises UnsupportedTypeError: 当遇到不支持的MySQL类型时抛出
    """
    # 1. 转换为MiaomaType
    miaoma_type = MySQLToMiaomaTypeConverter.convert(
        mysql_type=type_info.name,
        length=type_info.length,
        precision=type_info.precision,
        scale=type_info.scale
    )

    # 2. 获取MiaomaTypeInfo
    miaoma_type_info = MIAOMA_TYPE_INFO_MAP[miaoma_type]

    # 3. 返回Java类型
    return miaoma_type_info.java_type

def get_ts_type(type_info: MySQLTypeInfo) -> str:
    """
    从MySQL类型信息获取TypeScript类型

    转换流程：
    1. MySQL类型信息 -> MiaomaType
    2. MiaomaType -> MiaomaTypeInfo
    3. MiaomaTypeInfo -> ts_type

    :param type_info: MySQL类型信息
    :return: TypeScript类型字符串
    :raises UnsupportedTypeError: 当遇到不支持的MySQL类型时抛出
    """
    # 1. 转换为MiaomaType
    miaoma_type = MySQLToMiaomaTypeConverter.convert(
        mysql_type=type_info.name,
        length=type_info.length,
        precision=type_info.precision,
        scale=type_info.scale
    )

    # 2. 获取MiaomaTypeInfo
    miaoma_type_info = MIAOMA_TYPE_INFO_MAP[miaoma_type]

    # 3. 返回TypeScript类型
    return miaoma_type_info.ts_type